﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ErickOrlando.Utilidades.Windows
{
    public partial class _PlantillaPrompt : _Plantilla
    {
        public _PlantillaPrompt()
        {
            InitializeComponent();
            CadenaBusqueda = string.Empty;
            btnBuscar.Click += (s, e) => Buscar();
            ToolAceptar.ItemClick += (s, e) => Aceptar();
            ToolCancelar.ItemClick += (s, e) => Cancelar();
            KeyUp += _Plantilla_KeyPress;
            txtFiltro.TextChanged += txtFiltro_TextChanged;
            txtFiltro.KeyUp += Filtro;
            txtFiltro.ButtonClick += btnClearText_Click;
        }

        #region ShowDialog


        private void RealizarBusqueda()
        {
            if (CadenaBusqueda == string.Empty)
                return;

            Visible = false;
            txtFiltro.Text = CadenaBusqueda;
            Buscar();

            if (InfoListDataGridView != null)
                switch (InfoListDataGridView.RowCount)
                {
                    case 1:
                        Aceptar();
                        break;
                }
            else if (ObjetoLista != null)
                if (ObjetoLista.Count == 1)
                    Aceptar();

        }

        public new DialogResult ShowDialog()
        {
            if (!string.IsNullOrEmpty(CadenaBusqueda))
                return MostrarDialogo();
            else
                return base.ShowDialog();
        }

        public new DialogResult ShowDialog(IWin32Window owner)
        {
            if (!string.IsNullOrEmpty(CadenaBusqueda))
                return MostrarDialogo();
            else
                return base.ShowDialog(owner);
        }

        private DialogResult MostrarDialogo()
        {
            Visible = false;
            RealizarBusqueda();
            if (InfoListDataGridView != null)
                if (InfoListDataGridView.RowCount == 1)
                    return System.Windows.Forms.DialogResult.OK;
                else
                    //InfoListDataGridView.Columns[0].Visible = false; 
                    return base.ShowDialog();
            else if (ObjetoLista != null)
                if (ObjetoLista.Count == 1)
                    return System.Windows.Forms.DialogResult.OK;
                else
                    return base.ShowDialog();

            return base.ShowDialog();
        }


        #endregion

        #region Propiedades


        private bool m_DesdeGrilla;
        /// <summary>
        /// Criterio de Búsqueda predeterminado
        /// </summary>
        /// 
        [Description("Criterio de Búsqueda Predeterminado"), Category("Plantilla")]
        public string CriterioBusqueda { get; set; }

        private List<Criterios> m_ListaCriterios = new List<Criterios>();
        /// <summary>
        /// Lista Genérica de los Criterios que se usarán en el Prompt
        /// </summary>
        [Description("Lista Genérica de los Criterios que se usarán en el Prompt"), Category("Plantilla"), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public List<Criterios> ListaCriterios
        {
            get { return m_ListaCriterios; }
        }

        private List<object> m_ListaObjetos = new List<object>();
        /// <summary>
        /// Lista Genérica de Objetos que devuelve el Prompt
        /// Se puede usar Objetos ReadOnlyBase
        /// </summary>
        [Description("Lista Genérica de Objetos que devuelve el Prompt"), Category("Plantilla"), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public List<object> ListaObjetos
        {
            get { return m_ListaObjetos; }
        }

        /// <summary>
        /// Cadena que se buscará en el Prompt antes de llamar al formulario.
        /// Si la cadena está vacía siempre se muestra el formulario.
        /// </summary>
        [Description("Cadena que se buscará en el Prompt antes de llamar al Formulario"), Category("Plantilla"), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public string CadenaBusqueda { get; set; }

        private int m_NumeroCaracteres = 2;
        /// <summary>
        /// Número de Caracteres mínimo a validar en el cuadro de búsqueda
        /// </summary>
        [Description("Número de Caracteres mínimo a validar en el cuadro de búsqueda"), Category("Plantilla"), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public int NumeroCaracteres
        {
            get { return m_NumeroCaracteres; }
            set
            {
                if (value < 2)
                    throw new InvalidOperationException("No se puede establecer a un valor inferior a 2");
                m_NumeroCaracteres = value;
            }
        }


        #endregion

        #region Barra de Botones

        public virtual void Aceptar()
        {
            if (InfoListDataGridView != null)
                return;

            if (ObjetoLista != null)
            {
                m_ListaObjetos.Add(ObjetoLista.Current);
                DialogResult = System.Windows.Forms.DialogResult.OK;
            }
            else
                DialogResult = System.Windows.Forms.DialogResult.Cancel;
        }

        public virtual void Cancelar()
        {
            DialogResult = System.Windows.Forms.DialogResult.Cancel;
        }

        #endregion

        #region Formulario

        private void _PlantillaPrompt_DataGridCompleto()
        {
            Cursor = Cursors.Arrow;
        }

        public override void Formulario(object sender, EventArgs e)
        {
            base.Formulario(sender, e);
            if (InfoListDataGridView != null)
                InfoListDataGridView.DoubleClick += AceptarDesdeGrilla;
        }


        private void _Plantilla_KeyPress(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Escape:
                    Cancelar();
                    break;
                case Keys.Enter:
                    Buscar();
                    break;
            }

        }

        private void txtFiltro_TextChanged(object sender, System.EventArgs e)
        {
            if (txtFiltro.Visible & Visible)
            {
                if (txtFiltro.Text.IndexOf("%") > -1)
                {
                    txtFiltro.SuspendLayout();
                    txtFiltro.Text = txtFiltro.Text.Replace("%", string.Empty);
                    txtFiltro.ResumeLayout();
                }
            }
        }

        private void btnClearText_Click(System.Object sender, System.EventArgs e)
        {
            txtFiltro.Text = string.Empty;
        }

        private void AceptarDesdeGrilla(object sender, EventArgs e)
        {
            if (!m_DesdeGrilla)
            {
                Aceptar();
                m_DesdeGrilla = true;
            }
        }

        #endregion

        #region Actualizar

        public virtual void Actualizar()
        {
            Cursor = Cursors.WaitCursor;
        }

        #endregion

        #region Criterios de Búsqueda


        /// <summary>
        /// Procedimiento que establecerá la Propiedad CriterioBusqueda en base
        /// al indice de la coleccion de ListaCriterios
        /// </summary>
        public virtual void SeleccionaCriterios(Int32 Indice)
        {

            try
            {
                if (Visible)
                {
                    txtFiltro.Text = string.Empty;
                    txtFiltro.Focus();
                }

                //comprobamos que esté dentro del rango
                if (Indice < ListaCriterios.Count)
                    CriterioBusqueda = ListaCriterios[Indice].Valor;
            }
            catch (Exception)
            {
                throw new InvalidOperationException(Properties.Resources.SeleccionaCriteriosValue);
            }
        }


        public virtual void Buscar()
        {
            if (!txtFiltro.Visible)
                return;

            Cursor = Cursors.WaitCursor;
            var Success = false;
            int cantidad = txtFiltro.Text.Length;
            switch (cantidad)
            {
                case 0:
                    Success = false;
                    break;
                case 1:
                    if (!char.IsDigit(txtFiltro.Text.First()))
                        Success = false;
                    else
                        Success = true;
                    break;
                default:
                    if (!txtFiltro.Visible)
                    {
                        Success = false;
                        break;
                    }

                    if (cantidad < NumeroCaracteres)
                        Success = false;
                    else
                        Success = true;
                    break;
            }

            if (!Success)
                throw new ArgumentException(Properties.Resources.IngresaCriterios);

        }

        private void Filtro(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                Buscar();
                e.Handled = true;
            }
        }

        #endregion
    }
}
